"""
题目：反转一个双链表，并返回反转后的头节点。
"""


# 定义双链表节点类
class Node:
    def __init__(self, val=0, prev=None, next=None):
        self.val = val  # 节点存储的值
        self.prev = prev  # 指向前一个节点的指针
        self.next = next  # 指向后一个节点的指针

def reverse_doubly_linked_list(head):
    current = head
    # 用于临时存储节点的指针
    temp = None
    # 遍历整个链表，直到当前节点为None（到达原链表尾部）
    while current is not None:
        # 保存当前节点的前向指针到tmp对象中
        """
        temp 变量的作用是临时保存被覆盖前的指针值，确保在交换 prev 和 next 时不丢失原始信息。无论是显式用 temp 变量，还是通过 Python 语法糖（如 a, b = b, a 隐式处理），本质上都需要临时存储机制。因此，temp 是实现双链表反转不可或缺的（即使不显式命名为 temp，也需要类似的临时存储逻辑）。
        """
        temp = current.prev
        # 将当前节点的前向指针指向原后向节点（反转指针方向）
        current.prev = current.next
        # 将当前节点的后向指针指向原前向节点（完成双向指针反转）
        current.next = temp
        # 移动到下一个节点 prev指向已经变了
        current = current.prev
    # 反转后，原链表的尾节点变成新的头节点
    # 当原链表不为空时，最后一次保存的temp是原尾节点的前一个节点，即新链表的头节点的下一位
    if temp is not None:
        #取temp.prev,正式得到head值
        head = temp.prev
    # 返回反转后的头节点
    return head


#基于入参集合元素 创建双链表
def create_doubly_linked_list(arr):
    if not arr:
        return None
    head = Node(arr[0])
    current = head
    for val in arr[1:]:
        new_node = Node(val, current)
        current.next = new_node
        current = new_node
    return head


# 打印双链表
def print_doubly_linked_list(head):
    result = []
    current = head
    while current:
        result.append(str(current.val))
        current = current.next
    print("->".join(result))


# 测试
if __name__ == "__main__":
    # 创建链表: 1 <-> 2 <-> 3 <-> 4
    head = create_doubly_linked_list([1, 2, 3, 4])
    print("原链表: ", end="")
    print_doubly_linked_list(head)

    # 反转链表
    reversed_head = reverse_doubly_linked_list(head)
    print("反转后: ", end="")
    print_doubly_linked_list(reversed_head)  # 应输出: 4->3->2->1